/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.deployment.manager;

import br.com.deployment.entidade.arquivo.Anexo;
import br.com.deployment.message.Msg;
import br.com.deployment.servico.AnexoServico;
import com.google.gson.Gson;
import java.io.*;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.servlet.ServletContext;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;

/**
 *
 * @author elyjr
 */
@ManagedBean
@ViewScoped
public class ManagerArquivo implements Serializable {

    @EJB
    AnexoServico arquivoServico;
    private Anexo anexo;
    private List<Anexo> anexoList;
    private byte[] bytes;
    private String hash;
    private StreamedContent imagem;
    private List<StreamedContent> mostraList;

    public ManagerArquivo() {
    }

    @PostConstruct
    public void init() {
        imagem = new DefaultStreamedContent();
        anexo = new Anexo();
        anexoList = new ArrayList<Anexo>();
        mostraList = new ArrayList<StreamedContent>();
    }

    public byte[] getBytes() {
        return bytes;
    }

    public void setBytes(byte[] bytes) {
        this.bytes = bytes;
    }

    public Anexo getAnexo() {
        return anexo;
    }

    public void setAnexo(Anexo anexo) {
        this.anexo = anexo;
    }

    public List<Anexo> getAnexoList() {
        return anexoList;
    }

    public void setAnexoList(List<Anexo> anexoList) {
        this.anexoList = anexoList;
    }

    public void handle(FileUploadEvent event) throws IOException {
        handle(event.getFile().getContents(), event.getFile().getFileName(), event.getFile().getContentType());
    }

    private void handle(byte[] imageBytes, String nome, String tipo) throws IOException {
        bytes = imageBytes;

        anexo.setArquivo(bytes);
        anexo.setNome(nome);
        anexo.setTipo(tipo);
        anexoList.add(anexo);
        anexo = new Anexo();

        hash = new Gson().toJson(getMD5Hash(bytes));

//        ImageUploadServlet.IMAGE_BYTES_BY_HASH.put(hash, bytes);
    }

    private byte[] getMD5Hash(byte[] contents) {
        try {
            return MessageDigest.getInstance("MD5").digest(contents);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return null;
    }

    public String getHash() {
        return hash;
    }

    public void setHash(String hash) {
        this.hash = hash;
    }

    private byte[] getBytesFromFile(File file) throws IOException {
        if (file.exists()) {
            FileInputStream is = new FileInputStream(file);
            long length = file.length();
            byte[] bytes = new byte[(int) length];
            int offset = 0;
            int numRead = 0;
            while (offset < bytes.length && (numRead = is.read(bytes, offset, bytes.length - offset)) >= 0) {
                offset += numRead;
            }
            is.close();
            return bytes;
        }
        return null;
    }

    public void mostraArquivo(List<Anexo> lstArquivo) {
        for (Anexo anexo1 : lstArquivo) {
        }

    }

    public void criaArquivo(byte[] bytes, String arquivo) {
        System.err.println(arquivo);
        FileOutputStream fos;
        try {
            fos = new FileOutputStream(arquivo);
            fos.write(bytes);
            fos.close();
        } catch (FileNotFoundException ex) {
            Logger.getLogger(ManagerArquivo.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(ManagerArquivo.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

    public void handleFileUpload(FileUploadEvent event) {
        System.out.println("ANEXADO");
        Msg.messagemInfo("Arquivo anexado");

        byte[] conteudo = event.getFile().getContents();
        String tipo = event.getFile().getContentType();
        String nome = event.getFile().getFileName();

        anexo.setArquivo(conteudo);
        anexo.setTipo(tipo);
        anexo.setNome(nome);
        anexo.setUrl(nome.replaceAll(" ", "+"));

        anexoList.add(anexo);
        anexo = new Anexo();
  /*
        FacesContext facesContext = FacesContext.getCurrentInstance();
        ServletContext scontext = (ServletContext) facesContext.getExternalContext().getContext();
        String caminho = "/opt/UPLOAD_NOTARIO/" + nome.replace(" ", "+");//scontext.getRealPath(""+nome.replace(" ", "+"));
        System.err.println(caminho);
        
//        caminho = caminho.split("/dist")[0] + "/Cartorio-war/web/Uploads/" +nome.replace(" ", "+");
        
        System.err.println(caminho);
        System.err.println(anexoList);
        criaArquivo(conteudo, caminho);
*/
    }
    public List<String> img(){
        List<String> lstimg = new ArrayList<String>();
        for (Anexo anexo : anexoList) {
            lstimg.add(anexo.getNome());
        }
        return lstimg;
    }
}
